package com.luobo.found.prototype;

/**
 * 23种设计模式之:原型模式
 * 意图：用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。
 * 主要解决：在运行期建立和删除原型。
 *
 * java只拷贝你指定的对象，至于你指定的对象里面的别的对象，
 * 它不拷贝，还是把引用给你，共享变量，这是一种非常不安全的方式，需要特别注意。
 * 内部的数组和引用对象不会拷贝，其他的原始基本类型和String类型会被拷贝。
 *
 * 浅复制：被复制对象的所有变量都含有与原来的对象相同的值，而所有的对其他对象的引用都仍然指向原来的对象。
 * 深复制：把引用对象的变量指向复制过来的新对象，而不是原有的被引用的对象。
 *
 */
public class AAA implements Cloneable {
    private String id;
    private String id1;
    private String id2;
    private String id3;
    private String id4;
    private String id5;
    private BBB bbb;



    public AAA() {
        this.id = "".concat("花花").concat("花花").concat("花花").concat("花花");
        this.id1 = "".concat("花花").concat("花花").concat("花花").concat("花花");
        this.id2 = "".concat("花花").concat("花花").concat("花花").concat("花花");
        this.id3 = "".concat("花花").concat("花花").concat("花花").concat("花花");
        this.id4 = "".concat("花花").concat("花花").concat("花花").concat("花花");
        this.id5 = "".concat("花花").concat("花花").concat("花花").concat("花花");

    }

    public AAA(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getId1() {
        return id1;
    }

    public void setId1(String id1) {
        this.id1 = id1;
    }

    public String getId2() {
        return id2;
    }

    public void setId2(String id2) {
        this.id2 = id2;
    }

    public String getId3() {
        return id3;
    }

    public void setId3(String id3) {
        this.id3 = id3;
    }

    public String getId4() {
        return id4;
    }

    public void setId4(String id4) {
        this.id4 = id4;
    }

    public String getId5() {
        return id5;
    }

    public void setId5(String id5) {
        this.id5 = id5;
    }

    public BBB getBbb() {
        return bbb;
    }

    public void setBbb(BBB bbb) {
        this.bbb = bbb;
    }

    @Override
    protected AAA clone() throws CloneNotSupportedException {
        AAA aaa = null;
        try {
            aaa = (AAA) super.clone();
            //深拷贝
         //   aaa.setBbb(aaa.getBbb().clone());
            aaa.bbb = aaa.getBbb().clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return aaa;
    }
}
